package com.test.factory;

import com.test.exception.BeansException;
import com.test.processor.BeanPostProcessor;
import com.test.scope.Scope;

/**
 * ConfigurableBeanFactory接口继承了HierarchicalBeanFactory接口，
 * 提供了更多配置和管理bean的功能。
 */
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory {

    // 定义单例bean的作用域常量
    String SCOPE_SINGLETON = "singleton";

    // 定义原型bean的作用域常量
    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 在Bean工厂中注册一个新的作用域
     *
     * @param scopeName 作用域的名称，用于标识作用域
     * @param scope 作用域实例，定义了Bean的存储和生命周期管理方式
     */
    void registerScope(String scopeName, Scope scope);

    /**
     * 根据Bean的名称获取Bean类型的Class对象
     *
     * @param name Bean的名称
     * @return Bean类型的Class对象
     * @throws BeansException 如果无法找到指定名称的Bean类型时抛出
     */
    Class<?> getType(String name) throws BeansException;

    /**
     * 设置当前Bean工厂的父Bean工厂
     *
     * @param parentBeanFactory 父Bean工厂，用于构建继承关系
     */
    void setParentBeanFactory(ConfigurableBeanFactory parentBeanFactory);

    /**
     * 添加一个BeanPostProcessor到bean工厂中。
     * BeanPostProcessor可以用来在bean初始化前后执行额外的处理操作。
     *
     * @param beanPostProcessor 要添加的BeanPostProcessor实现类实例
     */
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

    /**
     * 销毁所有单例bean。
     * 在bean工厂关闭时调用此方法来释放资源。
     */
    void destroySingletons();
}

